﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ServerRPG
{
    static class ConfigurationManager
    {
        private static string _filePath;
        public static string FilePath
        {
            set { _filePath = value; }
            get { return _filePath; }
        }

        public static bool SetProperty(string propertyName, string propertyValue)
        {
            StringBuilder newFile = new StringBuilder();
            if (CheckFile())
            {
                string[] file = File.ReadAllLines(_filePath);

                string temp = ""; bool found = false;
                foreach (string line in file)
                {
                    temp = line;
                    temp = TransformLine(temp);
                    if (temp != "")
                        if (temp.Substring(0, temp.IndexOf('=')) == propertyName)
                        {
                            found = true;
                            temp = temp.Substring(0, temp.IndexOf('=')) + " = " + propertyValue;
                            newFile.Append(temp + "\r\n");
                            continue;
                        }
                    newFile.Append(line + "\r\n");
                }
                File.WriteAllText(_filePath, newFile.ToString(), Encoding.GetEncoding("UTF-8"));
                if (!found)
                    Console.WriteLine("Свойство '{0}' не найдено в файле.", propertyName);
                return false;
            } return false;
        }
        // Читаем параметр из файла.
        public static string[] GetPropertyArray()
        {
            if (CheckFile())
            {
                string[] propertyList = File.ReadAllLines(_filePath);
                for (int i = 0; i < propertyList.Length; i++)
                    propertyList[i] = TransformLine(propertyList[i]);
                string[] newlist = propertyList.Where(str => str != "").ToArray();
                return newlist;
            }
            else
                return null;
        }
        // Вырываем имя параметра из строки
        public static string GetPropertyNameFromArray(string[] propertyList, int lineNumber)
        {
            try
            {
                string line = propertyList[lineNumber];
                line = line.Substring(0, line.IndexOf('='));
                return line;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }
        // Вырываем значение параметра.
        public static string GetPropertValueFromArray(string[] propertyList, int lineNumber)
        {
            try
            {
                string line = propertyList[lineNumber];
                line = line.Substring(line.IndexOf('=') + 1, line.Length - line.IndexOf('=') - 1);
                return line;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }
        // Читаем опеределенный параметр из файла, получаем значение.
        public static string GetProperty(string propertyName)
        {
            string propertyValue = "";
            if (CheckFile())
            {
                StreamReader sreader = new StreamReader(_filePath);
                string line;
                while ((line = sreader.ReadLine()) != null)
                {
                    line = TransformLine(line);
                    if (line == "") continue;
                    if (line.Substring(0, line.IndexOf('=')) == propertyName)
                    {
                        propertyValue = line.Substring(line.IndexOf('=') + 1, line.Length - line.IndexOf('=') - 1);
                        sreader.Close();
                        return propertyValue;
                    }

                }
                Console.WriteLine("Свойство '{0}' не найдено в файле.", propertyName);
                sreader.Close();
                return "";

            }
            else return "";

        }

        public static void SetDefaultConfig(string[] configList)
        {
            if (!File.Exists(_filePath))
                File.WriteAllLines(_filePath, configList);
        }

        //Проверяем файл.
        private static bool CheckFile()
        {
            if ((_filePath != "") && (!File.Exists(_filePath)))
            {
                Console.WriteLine("Ошибка открытия файла {0}.", _filePath);
                return false;
            }
            return true;
        }
        // Редактируем строку.
        private static string TransformLine(string line)
        {
            if (line.Contains("="))
            {
                for (int i = 0; i < line.Length; )
                    if (((char)line[i] == ' ') || (line[i] == '\t'))
                    {
                        line = line.Remove(i, 1);
                    }
                    else break;
                for (int i = line.IndexOf('=') - 1; i > 0; i--)
                    if (line[i] == ' ')
                        line = line.Remove(i, 1);
                    else break;
                for (int i = line.IndexOf('=') + 1; i < line.Length; )
                    if (line[i] == ' ')
                        line = line.Remove(i, 1);
                    else break;
                for (int i = line.Length - 1; i > 0; i--)
                    if (line[i] == ' ')
                        line = line.Remove(i, 1);
                    else break;
                if (line[line.Length - 1] == ' ')
                    line = line.Remove(line.Length - 1, 1);
            }
            if (line.Contains('#'))
            {
                line = line.Remove(line.IndexOf('#'));
            }
            return line;
        }
    }
}